package cn.org.xiaoweiba.graduationdesign.bookmall.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;

import java.util.Objects;
import java.util.concurrent.TimeUnit;

/**
 * 和 Redis 相关的工具类
 */
@Component
public class RedisUtil {

    private RedisUtil() {}

    /**
     * redis template
     */
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 向 redis 中保存字符串类型的 value 值
     *
     * @param key 键
     * @param value 字符串类型的 value 值
     * @param expire 键值对的有效时间，为 null，则永久有效
     * @param expireUnit 有效时间的单位，默认秒
     */
    public void setStrVal(String key, Object value, Long expire, TimeUnit expireUnit) {
        ValueOperations valueOperations = redisTemplate.opsForValue();
        if (Objects.isNull(expire)) {
            valueOperations.set(key, value);
            return;
        }
        if (Objects.isNull(expireUnit)) {
            valueOperations.set(key, value, expire, TimeUnit.SECONDS);
            return;
        }
        valueOperations.set(key, value, expire, expireUnit);
    }

    /**
     * 向 redis 中保存字符串类型的 value 值
     *
     * @param key 键
     * @param value 字符串类型的 value 值
     * @param expire 键值对的有效时间，为 null，则永久有效，
     *               有效时间单位默认为秒
     */
    public void setStrVal(String key, Object value, Long expire) {
        setStrVal(key, value, expire, null);
    }

    /**
     * 向 redis 中保存字符串类型的 value 值，
     * 默认键值对永久有效
     *
     * @param key 键
     * @param value 字符串类型的 value 值
     */
    public void setStrVal(String key, Object value) {
        setStrVal(key, value, null, null);
    }

    /**
     * 从 redis 中获取字符串类型的 value 值
     *
     * @param key 键
     * @return 字符串类型的 value 值
     */
    public String getStrVal(String key) {
        return (String) redisTemplate.opsForValue().get(key);
    }

    /**
     * 从 redis 中获取字符串类型的 value 值，并以对象形式返回
     *
     * @param key 键
     * @return 对象形式的 value 值
     */
    public Object getStrValToObj(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 从 redis 中获取并删除字符串类型的 value 值
     *
     * @param key 键
     * @return 字符串类型的 value 值
     */
    public String getAndDelStrVal(String key) {
        return (String) redisTemplate.opsForValue().getAndDelete(key);
    }

    /**
     * 从 redis 中获取并删除字符串类型的 value 值，以对象形式返回
     *
     * @param key 键
     * @return 对象形式的 value 值
     */
    public Object getAndDelStrValObj(String key) {
        return redisTemplate.opsForValue().get(key);
    }

}
